package org.example.dao;

import org.example.pojo.Posts;
import org.example.utils.JDBCUtils;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class PostsDao {

    /**
     * 获取所有帖子
     *
     * @return 帖子列表
     * @throws SQLException 如果发生数据库访问错误
     */
    public List<Posts> getPosts() throws SQLException {
        List<Posts> postsList = new ArrayList<>(); // 创建存储帖子的列表
        String sql = "SELECT * FROM publish"; // SQL查询语句

        // 获取数据库连接并执行查询
        try (Connection conn = JDBCUtils.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql);
             ResultSet rs = pstmt.executeQuery()) {

            // 遍历结果集，将数据封装到Posts对象中
            while (rs.next()) {
                Posts post = new Posts(); // 创建新的帖子对象
                post.setId(rs.getInt("id")); // 设置帖子ID
                post.setTitle(rs.getString("title")); // 设置帖子标题
                post.setContent(rs.getString("content")); // 设置帖子内容
                post.setCreateTime(rs.getTimestamp("create_time")); // 设置创建时间
                post.setUpdateTime(rs.getTimestamp("update_time")); // 设置更新时间
                postsList.add(post); // 将帖子对象添加到列表中
            }
        }

        return postsList; // 返回帖子列表
    }

    /**
     * 获取帖子总数
     *
     * @return 帖子总数
     * @throws SQLException 如果发生数据库访问错误
     */
    public int getTotalPostCount() throws SQLException {
        String sql = "SELECT COUNT(*) FROM publish"; // SQL查询语句
        // 获取数据库连接并执行查询
        try (Connection conn = JDBCUtils.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql);
             ResultSet rs = pstmt.executeQuery()) {
            rs.next(); // 移动到结果集的第一行
            return rs.getInt(1); // 获取查询结果中的帖子总数
        }
    }

    /**
     * 分页获取帖子
     *
     * @param page     当前页码
     * @param pageSize 每页显示的帖子数量
     * @return 帖子列表
     * @throws SQLException 如果发生数据库访问错误
     */
    public List<Posts> getPosts(int page, int pageSize) throws SQLException {
        List<Posts> postsList = new ArrayList<>(); // 创建存储帖子的列表
        String sql = "SELECT * FROM publish LIMIT ? OFFSET ?"; // SQL查询语句

        // 获取数据库连接并执行查询
        try (Connection conn = JDBCUtils.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setInt(1, pageSize); // 设置每页显示的帖子数量
            pstmt.setInt(2, (page - 1) * pageSize); // 设置查询的偏移量
            try (ResultSet rs = pstmt.executeQuery()) {
                // 遍历结果集，将数据封装到Posts对象中
                while (rs.next()) {
                    Posts post = new Posts(); // 创建新的帖子对象
                    post.setId(rs.getInt("id")); // 设置帖子ID
                    post.setTitle(rs.getString("title")); // 设置帖子标题
                    post.setContent(rs.getString("content")); // 设置帖子内容
                    post.setCreateTime(rs.getTimestamp("create_time")); // 设置创建时间
                    post.setUpdateTime(rs.getTimestamp("update_time")); // 设置更新时间
                    postsList.add(post); // 将帖子对象添加到列表中
                }
            }
        }

        return postsList; // 返回帖子列表
    }

    /**
     * 删除指定ID的帖子
     *
     * @param postId 帖子ID
     * @throws SQLException 如果发生数据库访问错误
     */
    public void deletePost(int postId) throws SQLException {
        String sql = "DELETE FROM publish WHERE id = ?"; // SQL删除语句

        // 获取数据库连接并执行删除操作
        try (Connection conn = JDBCUtils.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setInt(1, postId); // 设置要删除的帖子ID
            pstmt.executeUpdate(); // 执行删除操作
        }
    }

    /**
     * 更新帖子
     *
     * @param post 包含更新信息的帖子对象
     * @throws SQLException 如果发生数据库访问错误
     */
    public void updatePost(Posts post) throws SQLException {
        String sql = "UPDATE publish SET title = ?, content = ?, update_time = ? WHERE id = ?"; // SQL更新语句

        // 获取数据库连接并执行更新操作
        try (Connection conn = JDBCUtils.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setString(1, post.getTitle()); // 设置帖子标题
            pstmt.setString(2, post.getContent()); // 设置帖子内容
            pstmt.setTimestamp(3, new Timestamp(System.currentTimeMillis())); // 设置更新时间为当前时间
            pstmt.setInt(4, post.getId()); // 设置帖子ID
            pstmt.executeUpdate(); // 执行更新操作
        }
    }
}